home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2001 October / macformat-108.iso / Shareware / Math scientific / PsyScript / libraries / screen.lib / screen.lib.rsrc / TEXT_2000_Source Text.txt < prev    next >
Encoding:
Text File  |  2001-08-05  |  4.2 KB  |  130 lines

  1.  
  2. property pDegToRad : 57.295779513082 --conversion factor to get degrees from radians
  3. property pMMPerDegree : 10
  4.  
  5. --these three need to be set correctly
  6. property pDistanceFromScreen_mm : 570
  7. property pScreenWidthMM : 335 --mm
  8. property pScreenHeightMM : 225 --mm
  9. --set these three
  10.  
  11.  
  12. --these will be set for you
  13. property pScreenSize : {}
  14. property pXpixels : 0
  15. property pYpixels : 0
  16. property pXDegrees : 0
  17. property pYDegrees : 0
  18. property pXCentrePixel : 0
  19. property pYCentrePixel : 0
  20. property pPixelsPerDegree : 0
  21. property pMsecPerFrame : 0
  22. property pFramesPerSecond : 0
  23.  
  24. --properties to help with stimuli such as smooth pursuit tasks: this reflects what you want to do 
  25. property pPixelsPerFrame : 0
  26. property pframesPerCycle : 0
  27. property pCyclespersecond : 0
  28. property pXmax : 0
  29. property pXmin : 0
  30.  
  31.  
  32. -->>Handlers
  33. to setDistanceScreenXAndScreenY(screenParameters) --call this first
  34.     set pScreenWidthMM to pScreenWidth_mm of screenParameters
  35.     set pScreenHeightMM to pScreenHeight_mm of screenParameters
  36.     my setDistanceFromScreen(pScreenDistance_mm of screenParameters) --this will also init the other dependent vars
  37. end setDistanceScreenXAndScreenY
  38.  
  39.  
  40. to setDistanceFromScreen(mmFromScreen) --called for you by "setDistanceScreenXAndScreenY"
  41.     set pDistanceFromScreen_mm to mmFromScreen
  42.     set pMMPerDegree to (sine of (1 / pDegToRad)) * pDistanceFromScreen_mm
  43.     my iInitialize()
  44. end setDistanceFromScreen
  45.  
  46. to iInitialize() -- you never need to call this
  47.     tell application "PsyScript"
  48.         --physical properties
  49.         set pScreenSize to screen size
  50.         set pXpixels to (get item 1 of pScreenSize)
  51.         set pYpixels to (get item 2 of pScreenSize)
  52.         set pXDegrees to pScreenWidthMM / pMMPerDegree
  53.         set pYDegrees to pScreenHeightMM / pMMPerDegree
  54.         set pXCentrePixel to round pXpixels / 2
  55.         set pYCentrePixel to round pYpixels / 2
  56.         set pPixelsPerDegree to pXpixels / pXDegrees
  57.         set pMsecPerFrame to tick time
  58.         set pFramesPerSecond to 1 / (pMsecPerFrame / 1000)
  59.     end tell
  60. end iInitialize
  61.  
  62. -->>Graphics Handlers
  63.  
  64. -->> Things to help with rectangles
  65. --getCentroid({{left, top}, {right, bottom}})
  66. --getCentroid({left, top, right, bottom})
  67.  
  68. on makeRect(side) --makes a rect this on a side
  69.     return {0, 0, round side, round side}
  70. end makeRect
  71.  
  72. on scaleRect(theRect, scaleFactor) --makes a rect this on a side
  73.     set {l, t, r, b} to theRect
  74.     return {l, t, ((r - l) * scaleFactor) + l, ((b - t) * scaleFactor) + t}
  75. end scaleRect
  76.  
  77. to centreRectOnPoint(theRect, thePoint) --currently inefficient two-pass version
  78.     --zero the rect (set tl to 0,0
  79.     set {l, t, r, b} to theRect
  80.     set theRect to {0, 0, r - l, b - t}
  81.     set initialCentre to my getCentroid(theRect)
  82.     set xOffset to (item 1 of thePoint) - (item 1 of initialCentre)
  83.     set yOffset to (item 2 of thePoint) - (item 2 of initialCentre)
  84.     set theRect to {l + xOffset, t + yOffset, r + xOffset, b + yOffset}
  85.     return theRect
  86. end centreRectOnPoint
  87.  
  88.  
  89. on getCentroid(theRect)
  90.     local x
  91.     local y
  92.     if class of item 1 of theRect is list then --assume 2 points
  93.         try
  94.             set {{l, t}, {r, b}} to theRect
  95.         on error m number n
  96.             error m number n
  97.         end try
  98.     else
  99.         try
  100.             set {l, t, r, b} to theRect
  101.         on error m number n
  102.             error m number n
  103.         end try
  104.     end if
  105.     set x to round (l + (r - l) / 2)
  106.     set y to round (t + (b - t) / 2)
  107.     return {x, y}
  108. end getCentroid
  109.  
  110.  
  111. -->>Experiment-specific helpers
  112.  
  113. to setDiagonalStimulus({degreesPerSecond:degreesPerSecond, maxDegrees:maxDegrees}) --stimulus properties
  114.     tell application "PsyScript"
  115.         --derived stimulus properties
  116.         set pPixelsPerFrame to round (degreesPerSecond * pPixelsPerDegree / pFramesPerSecond)
  117.         -->>WARNING any non-integer part will cause inaccuracy!! check that this is within bounds
  118.         set maxPixelExcursion to ((maxDegrees * pPixelsPerDegree) div pPixelsPerFrame) * pPixelsPerFrame --rounded to give a unit number of frames per cycle 
  119.         set pXmin to (pXCentrePixel - maxPixelExcursion)
  120.         set pXmax to (pXCentrePixel + maxPixelExcursion)
  121.         
  122.         set pframesPerCycle to maxPixelExcursion / pPixelsPerFrame * 4 --target woudl have been pFramesPerSecond / cyclespersecond
  123.         set pCyclespersecond to pFramesPerSecond / pframesPerCycle --fractional amounts are: 1 / (maxDegrees * 4 / degreesPerSecond)
  124.         set obtainedDegPerSec to (pPixelsPerFrame * pFramesPerSecond) / pPixelsPerDegree
  125.         return obtainedDegPerSec --degreesPerSecond
  126.     end tell
  127. end setDiagonalStimulus
  128.  
  129.  
  130.